#version 130


// Las coeficientes de iluminacion ambiente, sifusa y especular
uniform vec3 Ka;
uniform vec3 Kd;
uniform vec3 Ke;
uniform float Shininess;

// Los datos interpolados que vienen del vertex shader
in vec3 normal;
in vec3 luzDir_viewSpace;
in vec3 vertexPos_viewSpace;


float getIntensidadDifusa( vec3 normalNormalizada, vec3 dirLuzNormalizada );
float getIntensidadEspecular( vec3 normalNormalizada, vec3 dirLuzNormalizada, vec3 vertexPosNormalizado, float shine );


void main(){
	// Se normalizan la normal, la pos del vectice y la pos de la luz direccional para los calculos
	vec3 normalNorm = normalize( normal );
	vec3 dirLuzNorm = normalize( luzDir_viewSpace );
	vec3 verticeDirNorm = normalize( vertexPos_viewSpace );

	// Iluminacion ambiente, difusa y especular
	vec3 ilumAmbi = Ka;
	vec3 ilumDiff = Kd * getIntensidadDifusa( normalNorm, dirLuzNorm );
	vec3 ilumEspec = Ke * getIntensidadEspecular( normalNorm, dirLuzNorm, verticeDirNorm, Shininess );

	// Iluminacion total
	gl_FragColor = vec4( ilumAmbi + ilumDiff + ilumEspec, 1.0 );
}


// Se calcula la intensidad de la iluminacion difusa
float getIntensidadDifusa( vec3 normalNormalizada, vec3 dirLuzNormalizada ){
	float intensidad = dot( dirLuzNormalizada, normalNormalizada );
	intensidad = clamp(intensidad, 0.0, 1.0);
	
	return intensidad;
}


// Calcula la intensidad de la iluminacion especular
float getIntensidadEspecular( vec3 normalNormalizada, vec3 dirLuzNormalizada, vec3 vertexPosNormalizado, float shine ){
	// R: La direccion de la reflexion especular
	vec3 R = normalize( reflect( -dirLuzNormalizada, normalNormalizada ) );

	// V: La posicion del punto de vista
	vec3 V = normalize( vertexPosNormalizado );

	float intensidad = 0.0;
	float NdotL = dot(normalNormalizada, dirLuzNormalizada);
	if ( NdotL > 0.0 ){
		float cosAnguloVR = clamp( dot(V, R), 0.0, 1.0 );
		intensidad = pow( cosAnguloVR, shine );
	}

	return intensidad;
}


